﻿// 文件路径: ViewModels/LevelTreeNodeViewModel.cs
using Autodesk.Revit.DB;
using CommunityToolkit.Mvvm.ComponentModel;
using RevitProject.SpaceManager.Models; // 引用包含 LevelInfoModel 的命名空间
using RevitProject.SpaceManager.ViewModel.NavRoomVmPart;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;

namespace RevitProject.SpaceManager.ViewModel.NavRoomVmPart
{
    /// <summary>
    /// 表示楼层树视图中一个节点的 ViewModel。
    /// </summary>
    public partial class LevelTreeNodeViewModel : ObservableObject
    {
        #region 私有字段 Private Fields

        /// <summary>
        /// 关联的楼层基础信息模型。
        /// </summary>
        private readonly LevelInfoModel _levelInfo;
        
        private string _displayName;
        private string _elevationDisplay;
        private bool _isSelected;
        private bool _isExpanded = true; // 默认展开
        private int _roomCount;
        #endregion

        #region 可观察属性 Observable Properties

        /// <summary>
        /// 在树中显示的名称。
        /// </summary>
        public string DisplayName
        {
            get => _displayName;
            set => SetProperty(ref _displayName, value); // 使用 SetProperty 实现通知
        }

        /// <summary>
        /// 格式化后的楼层标高字符串 (例如 "6000")。
        /// </summary>
        public string ElevationDisplay
        {
            get => _elevationDisplay;
            // 通常只在构造时设置，设为 private set 避免外部修改
            private set => SetProperty(ref _elevationDisplay, value);
        }

        /// <summary>
        /// 指示此节点在 TreeView 中是否被选中。
        /// </summary>
        public bool IsSelected
        {
            get => _isSelected;
            set => SetProperty(ref _isSelected, value);
        }

        /// <summary>
        /// 指示此节点在 TreeView 中是否展开。
        /// </summary>
        public bool IsExpanded
        {
            get => _isExpanded;
            set => SetProperty(ref _isExpanded, value);
        }

        /// <summary>
        /// 与此楼层直接关联的房间数量。
        /// </summary>
        public int RoomCount
        {
            get => _roomCount;
            // 允许内部或公共更新计数
            set => SetProperty(ref _roomCount, value);
        }

        /// <summary>
        /// 与此楼层节点直接关联的房间行项目 ViewModel 集合。
        /// </summary>
        public ObservableCollection<RoomItemViewModel> AssociatedRoomVMs { get; } = new ObservableCollection<RoomItemViewModel>();

        /// <summary>
        /// 关联的 Revit 楼层元素的 ElementId。
        /// </summary>
        public ElementId LevelId => _levelInfo?.Id ?? ElementId.InvalidElementId;

        /// <summary>
        /// 对父节点的引用 (可选，根据需要)。
        /// 如果需要双向绑定或从子节点访问父节点，则保留。
        /// </summary>
        public LevelTreeNodeViewModel Parent { get; private set; } // 设为 private set

        #endregion


        #region 构造函数 Constructor

        /// <summary>
        /// 初始化 LevelTreeNodeViewModel 的新实例。
        /// </summary>
        /// <param name="levelInfo">楼层的基础信息模型。</param>
        /// <param name="roomsForLevel">属于此楼层的房间行项目 ViewModel 枚举。</param>
        /// <exception cref="ArgumentNullException">当 levelInfo 为 null 时抛出。</exception>
        public LevelTreeNodeViewModel(LevelInfoModel levelInfo, IEnumerable<RoomItemViewModel> roomsForLevel)
        {
            _levelInfo = levelInfo ?? throw new ArgumentNullException(nameof(levelInfo));
            _displayName = levelInfo.Name ?? "无效楼层";

            // 格式化标高（假设内部单位是英尺，显示为毫米整数）
            try
            {
                // 检查是否使用了 Revit 2021+ 的 API

                double elevationMM = UnitUtils.ConvertFromInternalUnits(levelInfo.Elevation, UnitTypeId.Millimeters);

                _elevationDisplay = $"{elevationMM:F0}"; // F0 表示无小数位
            }
            catch (Exception ex)
            {
                _elevationDisplay = "转换错误";
                Debug.WriteLine($"LevelTreeNodeViewModel 错误: 格式化楼层 '{_displayName}' 标高失败 - {ex.Message}");
            }

            // 添加关联的房间 ViewModel
            if (roomsForLevel != null)
            {
                foreach (var roomVM in roomsForLevel)
                {
                    // 可以在这里添加检查，确保 roomVM 确实属于这个楼层 (可选)
                    // if(roomVM.LevelId == this.LevelId)
                    AssociatedRoomVMs.Add(roomVM);
                }
            }
            _roomCount = AssociatedRoomVMs.Count; // 初始化房间计数
        }

        #endregion

        #region 公共方法 Public Methods

        /// <summary>
        /// 更新此节点的房间计数。
        /// </summary>
        public void UpdateRoomCount()
        {
            RoomCount = AssociatedRoomVMs?.Count ?? 0;
        }

        #endregion

        #region 重写方法 Overrides

        /// <summary>
        /// 返回表示当前对象的字符串。
        /// </summary>
        /// <returns>节点的显示名称。</returns>
        public override string ToString()
        {
            return DisplayName ?? base.ToString();
        }

        #endregion
    }
}